#ifndef _CORE__H
#define _CORE__H

#include "global.h"

/* 宏定义 */
#define SYNAPSES_COUNT 256  // 突触在一维上的最大坐标

/* 结构体 */
typedef struct SYNAPSES {
	int x;
	int y;
	int z;
	int transmission;
} SYNAPSES; // 三维环境的突触，SYNAPSES_COUNT的3次方个

typedef struct KEY_VALUE {
	int cmd; // command
	int value;
} KEY_VALUE;

#define KEY_VALUE_COUNT 16
typedef struct GLOBAL_ENVIRONMENT {
	KEY_VALUE env[KEY_VALUE_COUNT];
} GLOBAL_ENVIRONMENT;
 
#define CELL_SYNAPSES_COUNT 16 // max can to 128
typedef struct PARAM {
	int num; // number match cell
	int sns_in_count;
	SYNAPSES *sns_in[CELL_SYNAPSES_COUNT];
	int sns_out_count;
	SYNAPSES *sns_out[CELL_SYNAPSES_COUNT];
	GLOBAL_ENVIRONMENT *evms;
} PARAM;

typedef struct MEMORY {
	KEY_VALUE env[KEY_VALUE_COUNT];
} MEMORY;

typedef void (*CELL_FUNC)(void *, void *, void *);
typedef struct CELL {
	int cell_total; // total count
	int func_num; // function number, 用于休眠时存储方法序号
	CELL_FUNC cell_func;
	PARAM param;
	MEMORY mem;
} CELL;

#define CELLS_TOTAL_COUNT 6 // 总的细胞数可以改为动态调整的变量
#define CELLS_COUNT 128
// 包含了所有的细胞、细胞的输入输出突触、执行方法，并且都可以动态改变和保存，休眠时保存到文件，唤醒时从文件进行加载
extern CELL cells[CELLS_COUNT];

extern void core_init(void);
extern void core_step(void);
extern void core_exit(void);

#endif // _CORE__H
